package cmc.asiainfo.com.baidumap.base;

import android.content.Intent;
import android.content.pm.ActivityInfo;
import android.graphics.Color;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.text.TextUtils;
import android.util.Log;
import android.view.View;
import android.widget.Toast;

import com.jaeger.library.StatusBarUtil;

import butterknife.ButterKnife;
import cmc.asiainfo.com.baidumap.R;
import cmc.asiainfo.com.baidumap.widgets.titleBar.TitleBar;
import im.quar.autolayout.AutoLayoutActivity;

/**
 * @Author xihaitao
 * @Date 2017/2/8
 * @Function:
 *      activity基类，继承AutoLayoutActivity，实现屏幕自适应
 *      将BaseActivity转化为抽象类，内设多个抽象方法供子类重写
 */
public abstract class BaseActivity extends AutoLayoutActivity {

    private static final String TAG = BaseActivity.class.getSimpleName();

    // 页面顶部标题栏
    public TitleBar titleBar;
    // 标题栏Action标志
    public static final int T_BACK = 0;
    public static final int T_MENU1 = 1;
    public static final int T_MENU2 = 2;

    /**
     * 方法名：getContentViewLayoutID
     * 类型：抽象方法
     * 功能：返回与Activity绑定的Layout
     * @return
     */
    protected abstract int getContentViewLayoutID();

    /**
     * 方法名：initViewAndEvents
     * 类型：抽象方法：
     * 功能：初始化页面组件及事件
     */
    protected abstract void initViewAndEvents();

    /**
     * 方法名：loadData
     * 类型：抽象
     * 功能：数据请求获取，向服务器发送请求
     */
    protected abstract void loadData();

    /**
     * 方法名：initScreenOrientation
     * 功能：初始化屏幕方向，默认设置为竖屏，屏蔽横屏
     */
    private void initScreenOrientation() {
        if (getRequestedOrientation() != ActivityInfo.SCREEN_ORIENTATION_PORTRAIT) {
            setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
        }
    }

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        initScreenOrientation(); // 设置应用为竖屏模式，禁用横屏
        super.onCreate(savedInstanceState);
        // 绑定页面文件layout
        if (getContentViewLayoutID() != 0) {
            setContentView(getContentViewLayoutID());
        } else {
            Log.e(TAG, "ContentViewLayoutID is null, you should check your layout resource Id");
            throw new IllegalArgumentException("You must return a right contentView layout resource Id");
        }
        initStatusBar();
        ButterKnife.bind(this); // 绑定 ButterKnife 注释
        initViewAndEvents();
    }

    /**
     * 方法名：initStatusBar
     * 功能：实现沉浸式，设置全局沉浸式颜色
     * 说明：如果界面有自己的沉浸式处理，重写该方法，不要super
     */
    public void initStatusBar() {
        StatusBarUtil.setColor(this, Color.parseColor("#ff921b"));
    }

    @Override
    protected void onResume() {
        super.onResume();
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
    }

    /**
     * 方法名：showToast
     * 参数：字符串类型，需要显示的文本内容
     * 功能：Toast显示提示信息
     * @param msg
     */
    protected void showToast(String msg) {
        if (!TextUtils.isEmpty(msg)) {
            Toast.makeText(this, msg, Toast.LENGTH_SHORT).show();
        }else {
            Log.e(TAG, "You must be sure that Toast msg is not null");
        }
    }

    /**
     * 方法名：showToast
     * 参数：资源ID，需要显示的文本内容对应的资源ID
     * 功能：Toast显示提示信息
     * @param resourceID
     */
    protected void showToast(int resourceID) {
        if (resourceID != 0 && !TextUtils.isEmpty(getString(resourceID))) {
            Toast.makeText(this, getString(resourceID), Toast.LENGTH_SHORT).show();
        }else {
            Log.e(TAG, "You must be sure that resourceID is not zero and Toast msg is not null");
        }
    }

    /**
     * 方法名：initTitleBar
     * 参数：参数1，标题文本；参数2，标题栏左右两边的显示内容
     * 功能：设置标题栏显示内容，监听点击事件
     * @param title
     * @param icons
     */
    protected void initTitleBar(String title, Object... icons) {
        if (titleBar == null) {
            Log.e(TAG, "This titleBar is null");
            return;
        }else {
            // 如果你的项目使用了沉浸式，布局时候加上这行代码，TitleBar会自动填充状态栏。前提是先让沉浸式起作用
            // 但是本项目中使用StatusBarUtil实现的沉浸式，不再需要这句代码，否则标题栏会因为融合了状态栏，导致看起来高度超出预期效果。
//            titleBar.setImmersive(true);

            // 设置标题栏背景颜色
            titleBar.setBackgroundColor(Color.parseColor("#ff921b"));

            // 设置标题栏中间的文本显示
            if (!TextUtils.isEmpty(title)) {
                titleBar.setTitle(title);
                titleBar.setTitleColor(R.color.colorWhite);
            }else {
                Log.e(TAG, "The title is null or title's length is 0");
            }

            // 设置标题栏左边图标或文本，本项目中默认标题栏左边只有图标或者文本其中一个，如果需显示两个，请另写方法
            titleBar.setLeftTextColor(R.color.colorWhite); // 设置标题栏左边文本颜色为白色
            if (icons.length > 0) {
                if (icons[0] instanceof Integer) {
                    titleBar.setLeftImageResource((Integer) icons[0]);
                }else {
                    titleBar.setLeftText((CharSequence) icons[0]);
                }
                titleBar.setLeftClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {
                        titleEvent(T_BACK);
                    }
                });
            }

            // 设置标题栏右边图标或者文本，本项目中默认标题栏右边只有两个控件
            titleBar.setActionTextColor(R.color.colorWhite); // 设置标题栏右边文本颜色为白色
            if (icons.length >= 2) {
                if (icons[1] instanceof Integer) {
                    titleBar.addAction(new TitleBar.ImageAction((Integer) icons[1]) {
                        @Override
                        public void performAction(View view) {
                            titleEvent(T_MENU1);
                        }
                    }, 0);
                }else {
                    titleBar.addAction(new TitleBar.TextAction((String) icons[1]) {
                        @Override
                        public void performAction(View view) {
                            titleEvent(T_MENU1);
                        }
                    }, 0);
                }
            }
            if (icons.length >= 3) {
                if (icons[2] instanceof Integer) {
                    titleBar.addAction(new TitleBar.ImageAction((Integer) icons[2]) {
                        @Override
                        public void performAction(View view) {
                            titleEvent(T_MENU2);
                        }
                    }, 1);
                }else {
                    titleBar.addAction(new TitleBar.TextAction((String) icons[2]) {
                        @Override
                        public void performAction(View view) {
                            titleEvent(T_MENU2);
                        }
                    }, 1);
                }
            }
        }
    }

    /**
     * 方法名：titleEvent
     * 参数：标题栏点击事件类型ID
     * 功能：根据标题栏点击事件ID执行不同的操作，此处写的都是默认操作，子类可根据自己的需求重写该方法
     * @param actionID
     */
    protected void titleEvent(int actionID) {
        switch (actionID) {
            case T_BACK:
                Log.d(TAG, "This activity finish");
                finish();
                break;

            case T_MENU1:

                break;

            case T_MENU2:

                break;

            default:
                break;
        }
    }

    /**
     * 方法名：readyGo
     * 功能：跳转至指定页面，不携带数据
     * @param clazz
     */
    protected void readyGo(Class<?> clazz) {
        Intent intent = new Intent(this, clazz);
        startActivity(intent);
    }

    /**
     * 方法名：readyGo
     * 功能：跳转至指定页面，并携带数据
     * @param clazz
     * @param bundle
     */
    protected void readyGo(Class<?> clazz, Bundle bundle) {
        Intent intent = new Intent(this, clazz);
        if (null != bundle) {
            intent.putExtras(bundle);
        }
        startActivity(intent);
    }

    /**
     * 方法名：readyGoThenKill
     * 功能：跳转至指定页面，并结束当前页面
     * @param clazz
     */
    protected void readyGoThenKill(Class<?> clazz) {
        Intent intent = new Intent(this, clazz);
        startActivity(intent);
        finish();
    }

    /**
     * 方法名：readyGoThenKill
     * 功能：跳转至只当页面，携带数据，并结束当前页面
     * @param clazz
     * @param bundle
     */
    protected void readyGoThenKill(Class<?> clazz, Bundle bundle) {
        Intent intent = new Intent(this, clazz);
        if (null != bundle) {
            intent.putExtras(bundle);
        }
        startActivity(intent);
        finish();
    }

    /**
     * 方法名：readyGoForResult
     * 功能：跳转至指定页面，并协议好返回该页面的标志
     * @param clazz
     * @param requestCode
     */
    protected void readyGoForResult(Class<?> clazz, int requestCode) {
        Intent intent = new Intent(this, clazz);
        startActivityForResult(intent, requestCode);
    }

    /**
     * 方法名：readyGoForResult
     * 功能：跳转至指定页面，携带数据，并协议好返回该页面的标志
     * @param clazz
     * @param requestCode
     * @param bundle
     */
    protected void readyGoForResult(Class<?> clazz, int requestCode, Bundle bundle) {
        Intent intent = new Intent(this, clazz);
        if (null != bundle) {
            intent.putExtras(bundle);
        }
        startActivityForResult(intent, requestCode);
    }
}
